本文共 4909 字,大约阅读时间需要 16 分钟。
项目地址:https://github.com/ylpxzx/lifeblog
步骤
pip install whoosh,jieba,django-haystack# 尽量采用其他源的pip进行安装,比如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-haystack
INSTALLED_APPS = [ 'django.contrib.admin', ... 'post', 'haystack', #添加该行]
from haystack import indexesfrom .models import Post# 类名的命名规则是固定的,严格按照“应用名+Index”class PostIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True,template_name='search/indexes/post/post_text.txt') def get_model(self): return Post def index_queryset(self, using=None): return self.get_model().objects.all()
将site-packages/haystack/backends/whoosh_backend.py复制到应用app下,并更名为whoosh_cn_backend.py
在settings.py中设置haystack配置
# 配置搜索设置HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'post.whoosh_cn_backend.WhooshEngine', # post应用下的whoosh_cn_backend.py文件 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), # 指定了索引文件需要存放的位置,我们设置为项目根目录 BASE_DIR 下的 whoosh_index 文件夹(在建立索引时会自动创建)。 },}HAYSTACK_SEARCH_RESULTS_PER_PAGE = 6 # 指定如何对搜索结果分页,这里设置为每 6 项结果为一页。HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # 指定什么时候更新索引,这里我们使用 haystack.signals.RealtimeSignalProcessor,作用是每当有文章更新时就更新索引。由于博客文章更新不会太频繁,因此实时更新没有问题。
# 如:创建template/search/indexes/post/post_text.txt{ { object.title }}{ { object.content }}
# 创建索引python manage.py rebuild_index # 输入y即可# 更新索引python manage.py update_index
from haystack.views import SearchViewfrom django.core.paginator import Paginator,EmptyPage,PageNotAnIntegerfrom django.conf import settingsfrom django.shortcuts import render,redirectfrom django.db.models import Qclass MySearchIndex(SearchView): # template = 'search.html' def extra_context(self): context = super(MySearchIndex,self).extra_context() context['category_list'] = Category.objects.all().order_by('post_category') context['popular_post'] = Post.objects.all().order_by('-total_views')[:4] return context def create_response(self): if self.request.GET.get('q'): # print("进入not self.request") keyword = self.request.GET.get('q') # post_info = Post.objects.filter(title__contains=keyword) post_info = Post.objects.filter(Q(title__icontains=keyword)|Q(content__icontains=keyword)).order_by("id") # 搜索标题和文章内容 # post_info = Post.objects.all() paginator = Paginator(post_info, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE) try: page = paginator.page(int(self.request.GET.get('page', 1))) except PageNotAnInteger: page = paginator.page(1) except EmptyPage: page = paginator.page(paginator.num_pages) context = { 'query': self.query, 'form': self.form, 'page': page, 'paginator': paginator, 'suggestion': None, } context.update(self.extra_context()) return render(self.request, self.template, context) else: qs = super(MySearchIndex, self).create_response() # print(self.get_context()) return qs
url(r'^search/$', MySearchIndex(), name='haystack_search'),
{ % extends 'index.html' %}{ % block Banner %}{ % endblock %}{ % block area %}{ % endblock %}
网上示例需要在字段选取中间加个object,如:
{
{ post.object.short_detail|safe }}
项目文件结构
pip install six
文件路径
site-packages/six.py
site-packages/django/utils
from django.utils.six import python_2_unicode_compatible
转载地址:http://cgugn.baihongyu.com/